package design;

//使用内部类的时候，内部类才会加载，否则不会加载，也就是说，当调用getInstance的时候内部类才会加载
public class LazyStaticInnerClassSingleton {

    //不允许构造函数被反射直接调用，否则会抛出异常
    private LazyStaticInnerClassSingleton(){
        if(LazyHolder.INSTANCE != null){
            throw new RuntimeException("不允许通过反射创建实例");
        }
    }

//    //static关键字是为了使单例模式共享空间，保证这个方法不会被重写
    public static LazyStaticInnerClassSingleton getInstance(){
        //在返回结果前，一定会加载内部类
        return LazyHolder.INSTANCE;
    }

    private static class LazyHolder{
        private static final LazyStaticInnerClassSingleton INSTANCE = new LazyStaticInnerClassSingleton();
    }
}
